package portal.web.businessDelegate;


import integracion.rest.entities.Ranking;

import java.util.List;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import portal.excepciones.EliminarObjetoException;
import portal.excepciones.ErrorInesperadoException;
import portal.facade.PortalComprasFacadeStateful;
import portal.facade.PortalComprasFacadeStateless;
import portal.vo.CompraVO;
import portal.vo.ConfigVO;
import portal.vo.ItemVO;
import portal.vo.ProductoVO;
import portal.vo.UsuarioVO;

/**
 * Clase base que representa al servidor del lado del cliente
 *
 */
public class PortalComprasDelegate  {
	
	private Context initialContext = null;
	private static final String PKG_INTERFACES = "org.jboss.ejb.client.naming";
	final String appName = "PortalDeComprasEAR";
    final String moduleName = "PortalDeComprasSrv";
    final String sessionBeanNameStateless = "PortalComprasFacadeStatelessBean";
    final String viewClassNameStateless = PortalComprasFacadeStateless.class.getName();
    
    final String sessionBeanNameStateful = "PortalComprasFacadeStatefulBean";
    final String viewClassNameStateful = PortalComprasFacadeStateful.class.getName();
	
	private static PortalComprasDelegate instance = null;
	
	private PortalComprasFacadeStateless facadeStateless;
	
	//private PortalComprasFacadeStateful facadeStateful;
	
	public static PortalComprasDelegate getInstance() {
		if (instance == null) {
			instance = new PortalComprasDelegate();
		}
		return instance;
	}
	
	/**
	 * Instancia e inica un BusinessDelegate
	 *
	 */
	private PortalComprasDelegate() {
		super();
		inicializarContexto();
	}
	
	
	/**
	 * Se indica url del servidor de aplicaciones
	 *
	 */
	private void inicializarContexto() {
		
		//prueba para levantar el archivo properties
		System.out.println(getClass().getClassLoader().getResourceAsStream(
				  "jboss-ejb-client.properties"));
		
		try {
			Properties properties = new Properties();
            properties.put(Context.URL_PKG_PREFIXES, PKG_INTERFACES);
           
            //Objeto del tipo InitialContext 
			initialContext = new InitialContext(properties);
			facadeStateless = (PortalComprasFacadeStateless) initialContext.lookup("ejb:" + appName + "/" + moduleName + "//" + sessionBeanNameStateless + "!" + viewClassNameStateless);
			//facadeStateful = (PortalComprasFacadeStateful) initialContext.lookup("ejb:" + appName + "/" + moduleName + "//" + sessionBeanNameStateful + "!" + viewClassNameStateful + "?stateful");
		} catch (NamingException e) {
			throw new ErrorInesperadoException(e.getMessage());
		}
	}
	
	public UsuarioVO autenticarUsuario(UsuarioVO usuarioVO) {
		return facadeStateless.autenticarUsuario(usuarioVO);
	}
	
	public List<ProductoVO> getListaProductos() {
		return facadeStateless.getListaProductos();
	}
	
	public ProductoVO getProductoById(Long id){
		return facadeStateless.getProductoById(id);
	}
	
	public ProductoVO getProductoByCodigo(Long codigo){
		return facadeStateless.getProductoByCodigo(codigo);
	}
	
//	public void inicializar(UsuarioVO usuarioVO) {
//		facadeStateful.inicializar(usuarioVO);
//	}
	
//	public void agregarItem(ItemVO item) {
//		facadeStateful.agregarItem(item);
//	}
	
//	public List<ItemVO> getListaItems() {
//		return facadeStateful.getListaItems();
//	}
	
//	public void eliminarItem(Long idProducto)
//			throws EliminarObjetoException {
//		facadeStateful.eliminarItem(idProducto);
//	}
	
//	public ItemVO buscarItem(Long idProducto){
//		return facadeStateful.buscarItem(idProducto);
//	}
	
//	public void actualizarCantidadItem(Long idProducto, int cant) {
//		facadeStateful.actualizarCantidadItem(idProducto, cant);
//	}
	
//	public void confirmarCompra(){
//		facadeStateful.confirmarCompra();
//	}
	
	public List<ProductoVO> getListaProductosByCategoria(String categoria){
		return facadeStateless.getListaProductosByCategoria(categoria);
	}
	
	public List<ProductoVO> getListaProductosByNombre(String nombre) {
		return facadeStateless.getListaProductosByNombre(nombre);
	}
	
	public CompraVO getCompraById(Long idCompra) {
		return facadeStateless.getCompraById(idCompra);
	}

	public boolean actualizarEstadoCompra(Long idCompra) {
		return facadeStateless.actualizarEstadoCompra(idCompra);
		
	}

	public List<CompraVO> getListaComprasByUsuario(UsuarioVO usuarioVO) {
		return facadeStateless.getListaComprasByUsuario(usuarioVO);
	}
	
	public void actualizarRankingProductos(List<Ranking> listaRanking) {
		facadeStateless.actualizarRankingProductos(listaRanking);
	}
	
	public List<ConfigVO> getListaConfiguraciones(){
		return facadeStateless.obtenerConfiguraciones();
	}
	
	public void setListaConfiguraciones(List<ConfigVO> configs){
		//return facadeStateless.obtenerConfiguraciones();
		facadeStateless.actualizarConfiguraciones(configs);
	}
}
